if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[knjizenjePrometnog]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[knjizenjePrometnog]
GO


SET QUOTED_IDENTIFIER ON 
GO
SET ANSI_NULLS ON 
GO

CREATE PROC dbo.knjizenjePrometnog
	@POSLOVNA_GODINA numeric(4) ,
	@SIFRA_PREDUZECA varchar(12) ,
	@BROJ_PROMETNOG_DOK  numeric(10),
	@DATUM_NASTANKA_PROM_DOK datetime,  
	@OK BIT OUTPUT
AS
SET NOCOUNT ON

SET @OK = 0
--ovde pocinju osnovne provere vezane za prometni dokument
IF(SELECT STATUS FROM PROMETNI_DOKUMENT WHERE POSLOVNA_GODINA = @POSLOVNA_GODINA
AND SIFRA_PREDUZECA=@SIFRA_PREDUZECA AND BROJ_PROMETNOG_DOK=@BROJ_PROMETNOG_DOK AND DATUM_NASTANKA_PROM_DOK=@DATUM_NASTANKA_PROM_DOK) <> 'F'
BEGIN
RAISERROR('Nije dozvoljeno knjizenje prometnog dokumenta koji nije u fazi formiranja!',11,2)
RETURN
END

IF(SELECT DATUM_KRAJA_POSLOVNE_GODINE FROM POSLOVNA_GODINA WHERE POSLOVNA_GODINA=@POSLOVNA_GODINA AND SIFRA_PREDUZECA=@SIFRA_PREDUZECA) < GETDATE()
BEGIN
RAISERROR('Nije dozvoljeno knjizenje prometnog dokumenta cija je poslovna godina zakljucena!',11,2)
RETURN
END

IF @DATUM_NASTANKA_PROM_DOK > GETDATE()
BEGIN
RAISERROR('Nije dozvoljeno knjizenje prometnog dokumenta ciji je datum veci od danasnjeg!',11,2)
RETURN
END

IF NOT EXISTS(SELECT SIFRA_PREDUZECA,POSLOVNA_GODINA,BROJ_PROMETNOG_DOK,DATUM_NASTANKA_PROM_DOK FROM STAVKA_PROMETNOG_DOKUMENTA WHERE
	SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
	POSLOVNA_GODINA = @POSLOVNA_GODINA AND
	BROJ_PROMETNOG_DOK = @BROJ_PROMETNOG_DOK AND
	DATUM_NASTANKA_PROM_DOK = @DATUM_NASTANKA_PROM_DOK
)
BEGIN
RAISERROR('Nije dozvoljeno knjizenje prometnog dokumenta koji nema ni jednu stavku!',11,2)
RETURN
END
--kraj provera za prometni dokument
DECLARE @REDNI_BROJ_ST_PROM_DOK numeric(12),
		@SIFRA_GRUPE varchar(12),
		@SIFRA_ARTIKLA numeric(12),
		@SIFRA_SEKTORA varchar(12),
		@SIFRA_MAGACINA varchar(12),
		@KOLICINA numeric(12,2),
		@CENA money,
		@VREDNOST money,
		@VRSTA_DOKUMENTA char(1),
		@REDNI_BROJ_AN_MAG_KART numeric(10),
		@SMER char(1),
		@BROJ_TRANSAKCIJA numeric(5),
		@VR_UKUPNA money,
		@KOL_UKUPNA numeric(12,2),
		@NOVA_PROSECNA_CENA numeric(12,2),
		@NOVA_VR_UKUPNA money
		
SELECT @VRSTA_DOKUMENTA=VRSTA_DOKUMENTA,@SIFRA_SEKTORA=SIFRA_SEKTORA,@SIFRA_MAGACINA=SIFRA_MAGACINA FROM PROMETNI_DOKUMENT
WHERE
	SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
	POSLOVNA_GODINA = @POSLOVNA_GODINA AND
	BROJ_PROMETNOG_DOK = @BROJ_PROMETNOG_DOK AND
	DATUM_NASTANKA_PROM_DOK = @DATUM_NASTANKA_PROM_DOK
	

SET @BROJ_TRANSAKCIJA = @@TRANCOUNT

IF @BROJ_TRANSAKCIJA = 0
BEGIN TRANSACTION	

DECLARE crSTAVKA_PROMETNOG_DOKUMENTA CURSOR FOR
	SELECT SIFRA_PREDUZECA, POSLOVNA_GODINA, BROJ_PROMETNOG_DOK, DATUM_NASTANKA_PROM_DOK, REDNI_BROJ_ST_PROM_DOK, SIFRA_GRUPE, SIFRA_ARTIKLA, KOLICINA, CENA, VREDNOST
	FROM STAVKA_PROMETNOG_DOKUMENTA
	WHERE
			SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
			POSLOVNA_GODINA = @POSLOVNA_GODINA AND
			BROJ_PROMETNOG_DOK = @BROJ_PROMETNOG_DOK AND
			DATUM_NASTANKA_PROM_DOK = @DATUM_NASTANKA_PROM_DOK
	
	OPEN crSTAVKA_PROMETNOG_DOKUMENTA
	
	FETCH NEXT FROM crSTAVKA_PROMETNOG_DOKUMENTA INTO @SIFRA_PREDUZECA, @POSLOVNA_GODINA, @BROJ_PROMETNOG_DOK, @DATUM_NASTANKA_PROM_DOK, @REDNI_BROJ_ST_PROM_DOK, @SIFRA_GRUPE, @SIFRA_ARTIKLA, @KOLICINA, @CENA, @VREDNOST
	WHILE @@FETCH_STATUS=0
	BEGIN
		--pocetak obradjivanja stavki
		
		SELECT @KOL_UKUPNA=KOL_UKUPNA,
				@VR_UKUPNA=VR_UKUPNA
		FROM MAGACINSKA_KARTICA
		WHERE
			SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
			SIFRA_SEKTORA = @SIFRA_SEKTORA AND
			SIFRA_MAGACINA = @SIFRA_MAGACINA AND
			SIFRA_GRUPE = @SIFRA_GRUPE AND
			SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
			POSLOVNA_GODINA = @POSLOVNA_GODINA

		IF @@ROWCOUNT=0
		--nova magacinska kartica
		BEGIN
			INSERT INTO MAGACINSKA_KARTICA 
			(SIFRA_PREDUZECA, SIFRA_SEKTORA, SIFRA_MAGACINA, SIFRA_GRUPE, SIFRA_ARTIKLA, POSLOVNA_GODINA, PROSECNA_CENA, ZADNJA_NABAVNA_CENA, PLANSKA_CENA, KOL_POCETNA, KOL_ULAZA, KOL_IZLAZA, KOL_UKUPNA, VR_POCETNA, VR_ULAZA, VR_IZLAZA, VR_UKUPNA)
			VALUES
			(@SIFRA_PREDUZECA,@SIFRA_SEKTORA,@SIFRA_MAGACINA,@SIFRA_GRUPE,@SIFRA_ARTIKLA,@POSLOVNA_GODINA,0,0,0,0,0,0,0,0,0,0,0)
			IF @@ERROR <> 0
			BEGIN
				RAISERROR('Greska pri dodavanju prazne magacinske kartice',11,2)
				IF @BROJ_TRANSAKCIJA = 0 ROLLBACK TRANSACTION
				CLOSE crSTAVKA_PROMETNOG_DOKUMENTA
				DEALLOCATE crSTAVKA_PROMETNOG_DOKUMENTA
				RETURN
			END
		END
		
		SELECT @KOL_UKUPNA=KOL_UKUPNA,
				@VR_UKUPNA=VR_UKUPNA
		FROM MAGACINSKA_KARTICA
		WHERE
			SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
			SIFRA_SEKTORA = @SIFRA_SEKTORA AND
			SIFRA_MAGACINA = @SIFRA_MAGACINA AND
			SIFRA_GRUPE = @SIFRA_GRUPE AND
			SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
			POSLOVNA_GODINA = @POSLOVNA_GODINA
		
		SELECT @REDNI_BROJ_AN_MAG_KART = COUNT(*) FROM ANALITIKA_MAGACINSKE_KARTICE
		WHERE
				SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
				SIFRA_SEKTORA = @SIFRA_SEKTORA AND
				SIFRA_MAGACINA = @SIFRA_MAGACINA AND
				SIFRA_GRUPE = @SIFRA_GRUPE AND
				SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
				POSLOVNA_GODINA = @POSLOVNA_GODINA
				
		SET @REDNI_BROJ_AN_MAG_KART = @REDNI_BROJ_AN_MAG_KART + 1
	
		--updatovanje magacinske kartice
		
		--OTPREMNICA - IZLAZ
		IF @VRSTA_DOKUMENTA = 'O'
		BEGIN
			--nivelacija, ponavlja se jos 2 puta u zavisnosti od vrste dokumenta
			
			SET @NOVA_PROSECNA_CENA = (@VR_UKUPNA-@KOLICINA*@CENA)/(1+(@KOL_UKUPNA-@KOLICINA))
			SET @NOVA_VR_UKUPNA = (@KOL_UKUPNA - @KOLICINA)*@NOVA_PROSECNA_CENA - @VR_UKUPNA
			SET @SMER='I'
			IF (@VR_UKUPNA+@NOVA_VR_UKUPNA) < 0 
			BEGIN
				RAISERROR('Nije moguce otpremiti iz magacina koji je prazan!',11,2)
				IF @BROJ_TRANSAKCIJA = 0 ROLLBACK TRANSACTION
			    CLOSE crSTAVKA_PROMETNOG_DOKUMENTA
			    DEALLOCATE crSTAVKA_PROMETNOG_DOKUMENTA
				RETURN
			END
			UPDATE MAGACINSKA_KARTICA
				SET
					PROSECNA_CENA = @NOVA_PROSECNA_CENA,
					VR_IZLAZA = VR_IZLAZA + @VREDNOST,
					VR_UKUPNA = VR_UKUPNA + @NOVA_VR_UKUPNA,
					KOL_IZLAZA = KOL_IZLAZA + @KOLICINA,
					KOL_UKUPNA = KOL_UKUPNA - @KOLICINA
			WHERE
				SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
				SIFRA_SEKTORA = @SIFRA_SEKTORA AND
				SIFRA_MAGACINA = @SIFRA_MAGACINA AND
				SIFRA_GRUPE = @SIFRA_GRUPE AND
				SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
				POSLOVNA_GODINA = @POSLOVNA_GODINA	
		END
		IF @@ERROR <> 0
		BEGIN
		  RAISERROR('Greska pri izmeni kolicine u magacinskoj kartici',11,2)
		  IF @BROJ_TRANSAKCIJA = 0 ROLLBACK TRANSACTION
		  CLOSE crSTAVKA_PROMETNOG_DOKUMENTA
		  DEALLOCATE crSTAVKA_PROMETNOG_DOKUMENTA
		  RETURN
		END
		
		--PRIMKA - ULAZ
		IF @VRSTA_DOKUMENTA = 'P'
		BEGIN
			SET @NOVA_PROSECNA_CENA = (@VR_UKUPNA+@KOLICINA*@CENA)/(@KOL_UKUPNA+@KOLICINA)
			SET @NOVA_VR_UKUPNA = (@KOL_UKUPNA + @KOLICINA)*@NOVA_PROSECNA_CENA - @VR_UKUPNA
			SET @SMER='U'
			UPDATE MAGACINSKA_KARTICA
				SET
					PROSECNA_CENA = @NOVA_PROSECNA_CENA,
					VR_ULAZA = VR_ULAZA + @VREDNOST,
					VR_UKUPNA = VR_UKUPNA + @NOVA_VR_UKUPNA,
					KOL_ULAZA = KOL_ULAZA + @KOLICINA,
					KOL_UKUPNA = KOL_UKUPNA + @KOLICINA
			WHERE
				SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
				SIFRA_SEKTORA = @SIFRA_SEKTORA AND
				SIFRA_MAGACINA = @SIFRA_MAGACINA AND
				SIFRA_GRUPE = @SIFRA_GRUPE AND
				SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
				POSLOVNA_GODINA = @POSLOVNA_GODINA
		END
		IF @@ERROR <> 0
		BEGIN
		  RAISERROR('Greska pri izmeni kolicine u magacinskoj kartici',11,2)
		  IF @BROJ_TRANSAKCIJA = 0 ROLLBACK TRANSACTION
		  CLOSE crSTAVKA_PROMETNOG_DOKUMENTA
		  DEALLOCATE crSTAVKA_PROMETNOG_DOKUMENTA
		  RETURN
		END
		
		--MEDJUMAGACINSKI PROMET - M
		IF @VRSTA_DOKUMENTA = 'M'
		BEGIN
			--prvi magacin
			SET @SMER='U'
			SET @NOVA_PROSECNA_CENA = (@VR_UKUPNA-@KOLICINA*@CENA)/(1+(@KOL_UKUPNA-@KOLICINA))
			SET @NOVA_VR_UKUPNA = (@KOL_UKUPNA - @KOLICINA)*@NOVA_PROSECNA_CENA - @VR_UKUPNA
			UPDATE MAGACINSKA_KARTICA
				SET
					PROSECNA_CENA = @NOVA_PROSECNA_CENA,
					VR_ULAZA = VR_ULAZA - @VREDNOST,
					VR_UKUPNA = VR_UKUPNA + @NOVA_VR_UKUPNA,
					KOL_ULAZA = KOL_ULAZA - @KOLICINA,
					KOL_UKUPNA = KOL_UKUPNA - @KOLICINA
			WHERE
				SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
				SIFRA_SEKTORA = @SIFRA_SEKTORA AND
				SIFRA_MAGACINA = @SIFRA_MAGACINA AND
				SIFRA_GRUPE = @SIFRA_GRUPE AND
				SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
				POSLOVNA_GODINA = @POSLOVNA_GODINA
			
			--drugi magacin			
			DECLARE @MAG_SIFRA_PREDUZECA varchar(12),
					@MAG_SIFRA_SEKTORA varchar(12),
					@MAG_SIFRA_MAGACINA varchar(12)
					
			SELECT @MAG_SIFRA_PREDUZECA=MAG_SIFRA_PREDUZECA,@MAG_SIFRA_SEKTORA=MAG_SIFRA_SEKTORA,@MAG_SIFRA_MAGACINA=MAG_SIFRA_MAGACINA
			FROM PROMETNI_DOKUMENT
			WHERE POSLOVNA_GODINA = @POSLOVNA_GODINA AND SIFRA_PREDUZECA=@SIFRA_PREDUZECA AND BROJ_PROMETNOG_DOK=@BROJ_PROMETNOG_DOK AND DATUM_NASTANKA_PROM_DOK=@DATUM_NASTANKA_PROM_DOK
			--nova ukupna vrednost jer nije isti magacin
			SELECT @VR_UKUPNA=VR_UKUPNA, @KOL_UKUPNA=KOL_UKUPNA FROM MAGACINSKA_KARTICA
			WHERE
				SIFRA_PREDUZECA = @MAG_SIFRA_PREDUZECA AND
				SIFRA_SEKTORA = @MAG_SIFRA_SEKTORA AND
				SIFRA_MAGACINA = @MAG_SIFRA_MAGACINA AND
				SIFRA_GRUPE = @SIFRA_GRUPE AND
				SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
				POSLOVNA_GODINA = @POSLOVNA_GODINA
			
			SET @NOVA_PROSECNA_CENA = (@VR_UKUPNA+@KOLICINA*@CENA)/(@KOL_UKUPNA+@KOLICINA)
			SET @NOVA_VR_UKUPNA = (@KOL_UKUPNA + @KOLICINA)*@NOVA_PROSECNA_CENA - @VR_UKUPNA
			UPDATE MAGACINSKA_KARTICA
				SET
					PROSECNA_CENA = @NOVA_PROSECNA_CENA,
					VR_ULAZA = VR_ULAZA + @VREDNOST,
					VR_UKUPNA = VR_UKUPNA + @NOVA_VR_UKUPNA,
					KOL_ULAZA=KOL_ULAZA + @KOLICINA,
					KOL_UKUPNA=KOL_UKUPNA + @KOLICINA
			WHERE
				SIFRA_PREDUZECA = @MAG_SIFRA_PREDUZECA AND
				SIFRA_SEKTORA = @MAG_SIFRA_SEKTORA AND
				SIFRA_MAGACINA = @MAG_SIFRA_MAGACINA AND
				SIFRA_GRUPE = @SIFRA_GRUPE AND
				SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
				POSLOVNA_GODINA = @POSLOVNA_GODINA
		END
		IF @@ERROR <> 0
		BEGIN
		  RAISERROR('Greska pri izmeni kolicine u magacinskoj kartici',11,2)
		  IF @BROJ_TRANSAKCIJA = 0 ROLLBACK TRANSACTION
		  CLOSE crSTAVKA_PROMETNOG_DOKUMENTA
		  DEALLOCATE crSTAVKA_PROMETNOG_DOKUMENTA
		  RETURN
		END
		
		--ubacivanje u analitiku
		INSERT INTO ANALITIKA_MAGACINSKE_KARTICE 
		VALUES (@SIFRA_PREDUZECA,@SIFRA_SEKTORA,@SIFRA_MAGACINA,@SIFRA_GRUPE,@SIFRA_ARTIKLA,@POSLOVNA_GODINA,
				@REDNI_BROJ_AN_MAG_KART,@BROJ_PROMETNOG_DOK,@DATUM_NASTANKA_PROM_DOK,@REDNI_BROJ_ST_PROM_DOK,
				GETDATE(),@VRSTA_DOKUMENTA,@BROJ_PROMETNOG_DOK,@KOLICINA,@CENA,@VREDNOST,@SMER)
		
		--ukoliko je medjumagacinski
		IF @VRSTA_DOKUMENTA = 'M'
		BEGIN
			DECLARE @RBRAMMK numeric(5)
			SELECT @RBRAMMK = COUNT(*) FROM ANALITIKA_MAGACINSKE_KARTICE
			WHERE
				SIFRA_PREDUZECA = @SIFRA_PREDUZECA AND
				SIFRA_SEKTORA = @SIFRA_SEKTORA AND
				SIFRA_MAGACINA = @SIFRA_MAGACINA AND
				SIFRA_GRUPE = @SIFRA_GRUPE AND
				SIFRA_ARTIKLA = @SIFRA_ARTIKLA AND
				POSLOVNA_GODINA = @POSLOVNA_GODINA
				
		SET @RBRAMMK = @RBRAMMK + 1
		INSERT INTO ANALITIKA_MAGACINSKE_KARTICE 
		VALUES (@MAG_SIFRA_PREDUZECA,@MAG_SIFRA_SEKTORA,@MAG_SIFRA_MAGACINA,@SIFRA_GRUPE,@SIFRA_ARTIKLA,@POSLOVNA_GODINA,
			@RBRAMMK,@BROJ_PROMETNOG_DOK,@DATUM_NASTANKA_PROM_DOK,@REDNI_BROJ_ST_PROM_DOK,
			GETDATE(),@VRSTA_DOKUMENTA,@BROJ_PROMETNOG_DOK,-@KOLICINA,@CENA,@VREDNOST,@SMER)
		END
		--kraj medjumagacinskog dela
		IF @@ERROR <> 0
		BEGIN
		  RAISERROR('Greska pri ubacivanju sloga analitike magacinske kartice',11,2)
		  IF @BROJ_TRANSAKCIJA = 0 ROLLBACK TRANSACTION
		  CLOSE crSTAVKA_PROMETNOG_DOKUMENTA
		  DEALLOCATE crSTAVKA_PROMETNOG_DOKUMENTA
		  RETURN
		END
		FETCH NEXT FROM crSTAVKA_PROMETNOG_DOKUMENTA INTO @SIFRA_PREDUZECA, @POSLOVNA_GODINA, @BROJ_PROMETNOG_DOK, @DATUM_NASTANKA_PROM_DOK, @REDNI_BROJ_ST_PROM_DOK, @SIFRA_GRUPE, @SIFRA_ARTIKLA, @KOLICINA, @CENA, @VREDNOST
	END
	
	CLOSE crSTAVKA_PROMETNOG_DOKUMENTA
	DEALLOCATE crSTAVKA_PROMETNOG_DOKUMENTA

UPDATE PROMETNI_DOKUMENT
SET
	STATUS = 'P',
	DATUM_KNJIZENJA=GETDATE()
WHERE POSLOVNA_GODINA = @POSLOVNA_GODINA AND SIFRA_PREDUZECA=@SIFRA_PREDUZECA AND BROJ_PROMETNOG_DOK=@BROJ_PROMETNOG_DOK AND DATUM_NASTANKA_PROM_DOK=@DATUM_NASTANKA_PROM_DOK

IF @@ERROR <> 0
BEGIN
  RAISERROR('Greska pri izmeni statusa prometnog dokumenta',11,2)
  IF @BROJ_TRANSAKCIJA = 1 ROLLBACK TRANSACTION
  RETURN
END
IF @BROJ_TRANSAKCIJA = 1 COMMIT TRANSACTION

SET @OK = 1

GO
SET QUOTED_IDENTIFIER OFF 
GO
SET ANSI_NULLS ON 
GO